#ifndef BEARPI_H2821_H
#define BEARPI_H2821_H

#include <iostream>
#include "at_cmd_parser/at_cmd_parser.h"

static std::queue<std::string> srv_recv_queue;
static std::mutex srv_recv_mtx;
static std::condition_variable srv_cv;

class bearpi_h2821
{

public:
    bearpi_h2821(const std::string& work_mode);
    ~bearpi_h2821();

    //服务端相关函数
    int h2821_start_server();    //启动服务器模式
    int server_recv_data_poll(std::string& data);    //通过轮询方式获取数据
    int server_send_data(std::string& data);
    int server_send_data(std::string& client_id, std::string& data);


    //客户端相关函数
    int h2821_start_client();    //启动客户端模式
    int client_recv_data_poll(std::string& data);
    int client_send_data(std::string& data);


private:

    at_cmd_parser *at_parser = nullptr;

    //通用的AT指令
    int at_cmd(void);    //AT命令
    int ate_cmd(char flag);    //ATE命令，0-关闭回显，1-打开回显
    int at_reset(void);    //重启设备
    int at_restore(void);    //恢复出厂设置
    int at_uart_config(unsigned int baudrate, char databits, char stopbits, char parity, char flow_ctrl);
    int at_set_txpower(char pwr_value);    //设置发射功率
    int at_set_mac(const std::string& mac_addr);    //设置mac地址
    int at_set_mode(char work_mode);    //设置模组的工作模式


    //服务端回调函数
    static int server_ok_handler(const std::string& response);
    static int server_recv_process(const std::string& response);    //接收到服务端数据
    static int server_set_mode_handler(const std::string& response);
    static int server_set_mac_handler(const std::string& response);
    static int server_set_name_handler(const std::string& response);
    static int server_start_service_handler(const std::string& response);
    static int server_get_client_list_handler(const std::string& response);
    static int server_send_data_handler(const std::string& response);

//    static std::queue<std::string> srv_recv_queue;
//    static std::mutex srv_recv_mtx;
//    static std::condition_variable srv_cv;
    
    void server_thread_handler();    //服务端线程
    std::thread server_thread;    //服务端线程句柄

    //服务端指令
    int at_s_set_name(const std::string& name);    //设置服务端名字
    int at_start_server(char enable, char encry, const std::string& secret_key);    //开启服务
    int at_s_client_list();    //服务端获取用户连接列表
    int at_s_send_data(std::string& client, std::string& data_str);    //服务端向客户端发送数据
    int at_s_send_data(std::string& data_str);    //服务端向所有客户端发送数据
    

    //客户端回调函数
    static int client_ok_handler(const std::string& response);
    static int client_recv_process(const std::string& response);    //接收到服务端数据
    static int client_set_mode_handler(const std::string& response);
    static int client_set_mac_handler(const std::string& response);
    static int client_set_name_handler(const std::string& response);
    static int client_connect_handler(const std::string& response);

    void client_thread_handler();    //客户端线程
    std::thread client_thread;    //客户端线程句柄


    //客户端指令
    int at_c_set_name(const std::string& name);    //设置客户端名字
    int at_client_connect(const std::string& srv_name, int encry_type, const std::string& secret_key);    //客户端开始连接

    
};





#endif


